Skip to main content

linux当路由器

系统参数设置

进入/etc/sysctl.d/,我们设置一些参数,比如转发之类的,还有ipv6的设定。

vim /etc/sysctl.d/99-ip-forward.conf
#ipv4转发
net.ipv4.ip_forward=1

# IPv6转发和相关网络配置
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.accept_ra=2
net.ipv6.conf.default.accept_ra=2
net.ipv6.conf.eth0.accept_ra=2 #这里是你的wan口
net.ipv6.conf.br-lan.accept_ra=0

# 允许路由通告转发
net.ipv6.conf.all.proxy_ndp=1
net.ipv6.conf.default.proxy_ndp=1

# 禁用IPv6隐私扩展(可选)
net.ipv6.conf.all.use_tempaddr=0
net.ipv6.conf.default.use_tempaddr=0

#bbr配置
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

systemd-networkd配置

由于Arch自带systemd-network,我也就不用其他的了,装完Arch后,我们先确认下自己的网口是哪些:

ip a

这里我的网口是eth0 eth1 eth2 eth3,共四个

进入到/etc/systemd/network/目录下

cd /etc/systemd/network

创建一个wan口的DHCP配置文件(这里我的wan口为DHCP,获取光猫分配的ip)

vim 10-wan.network
[Match]
Name=eth0 #修改成你自己的wan口

[Network]
DHCP=yes
IPv6AcceptRA=yes

[DHCPv6]
UseDelegatedPrefix=yes

[IPv6AcceptRA]
DHCPv6Client=always

:wq保存退出后,这里我将其他三个网口用作lan,这里我们用br-lan将三个网口桥接在一起,方便配置:

vim 15-br-lan.netdev
[NetDev]
Name=br-lan
Kind=bridge

接着我们将新建的br-lan这个网口和其他三个连接在一起:

vim 20-lan-slaves.network
[Match]
Name=eth1 eth2 eth3 #修改成你自己的lan口

[Network]
Bridge=br-lan

最后就可以配置lan口了,这里我DHCP服务器也用systemd-network,lan口地址为10.100.100.1/24

vim 25-br-lan-address.network
[Match]
Name=br-lan

[Link]
Multicast=yes

[Network]
Address=10.100.100.1/24
DHCPServer=yes
MulticastDNS=yes
IPv6SendRA=yes
IPv6AcceptRA=no
DHCPPrefixDelegation=yes

[DHCPServer]
PoolOffset=10
PoolSize=200
DefaultLeaseTimeSec=86400
EmitDNS=yes
DNS=_self
EmitRouter=yes


[DHCPPrefixDelegation]
UplinkInterface=eth0 #修改成你自己的wan口
SubnetId=0x1
Assign=yes

[IPv6SendRA]
Managed=no
OtherInformation=yes
EmitDNS=yes
DNS=_link_local
DNSLifetimeSec=3600

启动systemd-network并设为开机自启:

systemctl enable --now systemd-networkd

这时候执行ip a应该就可以发现,你的wan口和br-lan口都工作正常,也应该能获得上级路由器分配的IPV6地址

nftables配置

这里我就用Nftables了,也够折腾的。 先安装nftables:

pacman -S nftables

安装完成后,修改nftables配置文件:

vim /etc/nftables.conf
#!/usr/sbin/nft -f
flush ruleset

table inet filter {
set trusted_interfaces {
type ifname
elements = { "br-lan", "lo"}
}

chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iifname @trusted_interfaces accept
meta l4proto { icmp, icmpv6 } accept
# 允许DHCPv6通信
udp dport 546 accept
udp sport 547 accept
}

chain forward {
type filter hook forward priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iifname "br-lan" oifname "eth0" accept
ip6 nexthdr icmpv6 accept
ip6 nexthdr udp udp dport 546 accept
ip6 nexthdr udp udp sport 547 accept
}
}

table ip nat {
chain postrouting {
type nat hook postrouting priority srcnat;
oifname "eth0" masquerade
}
}

include "/etc/nftables.d/*.conf"

这里我在末尾添加了一段include "/etc/nftables.d/*.conf",以后有啥新增的直接放在那里去,不用动主配置文件。 要注意将配置文件中的eth0修改成你自己的wan

启动nftables并设为开机自启:

systemctl enable --now nftables

DNS服务器

这里我用dnsmasq了,其实也可以用AdguardHome,只要监听53端口就行了:

pacman -S dnsmasq

修改配置文件:

vim /etc/dnsmasq.conf
interface=br-lan
bind-interfaces
port=53
no-resolv
server=223.5.5.5#53

这里将DNS请求转发到阿里DNS上面去了,可以根据你自己喜欢修改,或者直接上AdguardHome 启动并设为开机自启

systemctl enable --now dnsmasq